import sys
from pathlib import Path

base_path = str(Path(__file__).resolve().parent.parent)
sys.path.append(base_path)
from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate
from langchain_core.example_selectors import SemanticSimilarityExampleSelector
from langchain_core.output_parsers import StrOutputParser
from langchain_community.vectorstores.chroma import Chroma
from create_llm import create_embeddings, create_llm

# 1.准备样例
examples = [
    {"question": "如何安装Python？", "answer": "从官网下载安装包并运行安装程序。"},
    {"question": "Python有哪些IDE？", "answer": "PyCharm、VS Code、Jupyter等。"},
    {"question": "如何处理Python依赖？", "answer": "使用pip或conda管理依赖。"},
    {
        "question": "未来 AI 会取代人类的工作吗？",
        "answer": "AI 会取代部分重复性工作，但也会创造新岗位，未来是人机协同模式。",
    },
    {
        "question": "边缘 AI 和云端 AI 有什么不同？",
        "answer": (
            "云端 AI 在远程服务器处理数据，边缘 AI 在设备本地处理，后者更快更安全但计算能力有限。"
        ),
    },
    {
        "question": "如何理解 AI 的 “涌现” 能力？",
        "answer": (
            "AI 的 “涌现” 能力指大语言模型在规模达到一定程度后，自发产生未编程的复杂能力。"
        ),
    },
    {
        "question": "什么是生成式 AI？",
        "answer": (
            "生成式 AI 是基于训练数据，利用深度学习模型生成文本、图像等全新内容的人工智能技术。"
        ),
    },
    {
        "question": "大语言模型和普通 AI 模型有什么区别？",
        "answer": (
            "大语言模型参数规模庞大，能理解生成复杂语言，具备推理泛化能力，普通 AI 模型规模小、功能专一。"
        ),
    },
    {
        "question": "AI 伦理问题主要体现在哪些方面？",
        "answer": (
            "AI 伦理体现在数据隐私、算法偏见、就业冲击、虚假信息传播及决策不透明等方面。"
        ),
    },
    {
        "question": "AI 在医疗领域有哪些实际应用？",
        "answer": "AI 在医疗中用于医学影像诊断、疾病预测、药物研发及智能健康监测。",
    },
]

# 2.准备好嵌入模型
embeddings = create_embeddings()

# 3.创建语义相似度选择器
example_selector = SemanticSimilarityExampleSelector.from_examples(
    examples=examples,  # 示例
    embeddings=embeddings,  # 嵌入模型
    vectorstore_cls=Chroma,  # 向量数据库
    k=2,  # 选择数量
)

# 4.创建样例模版
example_prompt = PromptTemplate(
    input_variables=["question", "answer"],
    template="问题：{question}\n答案：{answer}\n",
)

# 5.创建提示模版
prompt = FewShotPromptTemplate(
    example_selector=example_selector,
    example_prompt=example_prompt,
    prefix="你是Python编程助手，请回答：",  # 定义chain身份
    suffix="问题：{input}\n回答：\n",  # 用户提问
    input_variables=["input"],
)


# 6.创建日志函数
def log(val):
    print(val)
    print("\n-------------------------------")
    return val


# 7.创建语言模型
llm = create_llm()

# 8.创建链
chain = prompt | log | llm | StrOutputParser()

temp = chain.invoke({"input": "AI出现后会对人类的生活作出怎么样的改变"})
print(temp)
